@邪恶贝壳
2年前 提问
2个回答

Java 项目如何进行安全开发

Andrew
2年前
官方采纳

Java项目的安全开发一般需要注意以下这些方面的规范:

  • 输入验证:对于用户输入项进行数据验证,除常见的数据格式、数据长度外,还需要对特殊的危险字符进行处理。对于核心业务功能,除在客户端或浏览器进行数据验证外,还必须在服务器端对数据进行合法性检验,规避用户跳过客户端校验,直接将不合规的数据保存到应用中;对于浏览器重定向地址的数据,需要进行验证核实,确认重定向地址是否在可信,并且需要对换行符(r或n)进行移除或者替换。

  • 数据输出:对需要输出到用户浏览器的任何由用户创造的内容,应在输出到浏览器之前或持久化存储之前进行转义(至少对<>转义为< >)以防止跨站攻击脚本(XSS)。对于无法规避的HTML片段提交,需对 scriptiframe标签进行检查处理,避免应用被挂马的可能性;在程序中应尽量规避SQL的拼接处理,优先推荐使用iBatis/MyBaits框架,其次推荐使用SQL的参数化查询方法,在无法避免使用SQL拼接时,因对SQL参数值进行编码处理(至少对单引号进行编码)。

  • 会话管理:不要在 URL、错误信息或日志中暴露会话标识符。会话标识符应当只出现在HTTP cookie头信息中。比如,不要将会话标识符以 GET参数进行传递;将cookie设置为HttpOnly属性,除非在应用程序中明确要求了客户端脚本程序读取或者设置 cookie的值;从Cookie或者Session中获取之前保存的数据进行应用时,须增加必要的数据检验;对于敏感的业务操作,通过在每个请求或每个会话中使用强随机令牌或参数,为高度敏感或关键的操作提供标准的会话管理。

  • 访问控制:应用必须具备授权访问控制功能,能够限制在最小的范围内使用系统功能。同时限制只有授权的用户可以访问受保护的URL。

  • 文件管理:在文件上传处理中,应限制符合要求格式的文件,尽量避免用户直接上传可执行文件或在服务器端限制可执行文件的执行权限;在文件下载时,应规避直接列举服务器上的文件,同时规避将服务器端的路径作为参数进行传递,避免用户非法获取服务器端文件。

  • 数据加密:原则上在程序代码中不能直接写入用户和密码,对于无法规避的情况,应当对使用的用户名、密码进行加解密处理,在程序中使用加密后的内容。

  • 错误处理:不要在错误响应将服务器的信息暴露给最终用户,例如:服务器的IP地址、操作系统的类型和版本、会话标识符、账号信息等,从而避免增加服务端被黑客攻击的可能性;在错误处理时,因在后台统一进行日志记录,避免显示调试或堆栈跟踪信息,建议使用通用的错误消息并使用定制的错误页面。

  • 其它通用规范:审核应用使用的第三方开发框架、第三方代码或类库文件,以确定业务的需要,并验证功能的安全性,避免产生新的漏洞;执行安全更新。如果应用程序采用自动更新,则为您的代码使用加密签名,以确保的您的下 载客户端验证这些签名。使用加密的信道传输来自主机服务器的代码。

安全侠
2年前

以下为大家介绍的基本规则,可以为构建更安全的Java应用程序奠定良好的基础。供参考学习!

Java安全规则1:编写简单而强大的Java代码
漏洞喜欢隐藏在复杂代码中,因此在不牺牲功能的情况下使代码尽可能简单。在代码中公开尽可能少的信息,隐藏实施细节,支持可维护和安全的代码。下面三个技巧将大大有助于编写安全的Java代码:充分利用 Java的访问修饰符。为类,方法及其属性声明访问级别,可以设为private的所有内容都应该为private。避免过度使用反射和内省。在某些情况下,应该使用这种高级技术,但是在大多数情况下,您应该避免使用它们。使用反射消除了强类型化,可能会给代码引入漏洞和不稳定性。将类名与字符串进行比较容易出错,并且很容易导致名称空间冲突。始终定义尽可能小的API和接口。解耦组件并使它们在尽可能小的区域内交互。即使您的应用程序的某个区域出现漏洞,其他区域也将是安全的。

Java安全规则2:避免使用Java自带的序列化
序列化接受远程输入,并将其转换为完全赋值的对象。它省去了构造函数和访问修饰符,并允许未知数据流成为JVM中的运行代码。Java序列化从根本上来说是不安全的。Oracle就有长期计划 从Java中删除自带的序列化功能,甲骨文公司Java平台小组的首席架构师Mark Reinhold说,Java漏洞中的三分之一或更多都涉及到序列化的问题。尽可能避免在Java代码中使用自带的序列化/反序列化。可以考虑使用JSON或YAML之类的序列化格式,并且永远不要公开接收并作用于序列化流的不受保护的网络请求端点。

Java安全规则3:永远不要公开未加密的凭证或PII
很多的应用,当用户在浏览器中输入密码时,密码将以纯文本格式发送到您的服务器。正确的做法是:先通过单向密码对密码进行加密,然后再将其持久保存到数据库中,然后在每次与该值进行比较时再次进行加密保存。密码规则适用于所有个人身份信息(PII):信用卡,社会保险号等。委托给您应用程序的任何个人信息都应得到最高程度的保护。数据库中未加密的凭据或PII是一个巨大的安全漏洞,正在等待攻击者发现。同样,切勿将原始凭据写入日志,或以其他方式传输到文件或网络。密码与密钥分开保存。

Java安全规则4:使用已知和经过测试的库
尽可能使用已知的可靠库和框架。从密码哈希到REST API授权,都要谨慎的选择第三方库。对于web应用程序安全性,Spring Security已经是事实上的标准。它提供了广泛的选择和灵活性,以适应任何应用程序体系结构,并且融合了多种安全方法。

Java安全规则5:不要对外部输入抱有幻想
无论是来自用户输入表单,数据存储区还是远程API,对于任何外部输入都不要放松警惕。SQL注入和跨站点脚本(XSS)是由于处理外部输入错误而引起的最常见攻击。每当您收到输入时,都应该对其进行检查和校验。

Java安全规则6:始终使用PreparedStatement来处理SQL参数
每当您构建一条SQL语句时,都有可能被插入一段可执行的SQL代码。始终使用java.sql.PreparedStatement类创建SQL是一个好习惯。对于NoSQL存储(如MongoDB)也存在类似的功能。绝大部分的ORM框架,都支持该功能。

Java安全规则7:不要向用户展示服务异常信息
生产中的服务异常信息可以为攻击者提供丰富的信息来源。堆栈跟踪尤其可以揭示有关您正在使用的技术及其使用方式的信息。避免向最终用户显示堆栈跟踪信息,这非常重要。

Java安全规则8:使安全性发布保持最新
通过定期检查Oracle主页以获取security-alerts确保知道可用的重要补丁程序 。每个季度,Oracle都会为Java的当前LTS(长期支持)版本提供一个自动补丁更新。问题是,只有在您购买Java支持许可证的情况下,该补丁才可用。

Java安全规则9:查找依赖库漏洞
有许多工具可以自动扫描您的代码库和依赖项是否存在漏洞。OWASP(开放式Web应用程序安全性项目)是致力于改善代码安全性的组织。OWASP的值得信赖的高质量自动代码扫描工具列表 ,包括多个面向Java的安全检查工具。

Java安全规则10:监视和记录用户活动
如果您没有积极地监视应用程序运行状态,那么即使是简单的暴力攻击也可能会成功攻陷你的app。使用监视和日志记录工具来监视应用程序的运行状况。监视可以提醒您注意到无法被解释的峰值,而日志记录可以帮助您了解攻击后出了什么问题。

Java安全规则11:当心DoS攻击
每当要执行消耗资源的的操作(例如将压缩文件解压缩)时,都应该监视资源使用量的增长。对其进行监视,并防止服务器资源过度使用,以及更多的自动化的应急响应方案。

Java安全规则12:考虑使用Java安全管理器
Java有一个安全管理器,可用于限制正在运行的进程可以访问的资源。它可以根据磁盘,内存,网络和JVM访问来隔离程序。缩小对应用程序的这些资源的过度占用,可以减少攻击可能造成的危害。